<?php 
#短连接生成算法

/**
 * 将字符串生成md5()字符串
 * Class Short_Url
 * short() = simple()
 */

class Short_Url {
    #字符表
    public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public static function short($url, $host = '') {
        $key = "alexis";
        $urlhash = md5($key . $url);
        $len = strlen($urlhash);

        #将md5() 加密后的串分成4段，每段8个字符作为16进制 = 4字节是32位
        #\，一共可以生成四组短连接
        for ($i = 0; $i < 4; $i++) {
            $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);
            #将分段的位与0x3fffffff做位与，0x3fffffff表示二进制数的30个1，即30位以后的加密串都归零
            #此处需要用到hexdec()将16进制字符串转为10进制数值型，否则运算会不正常
            $hex = hexdec($urlhash_piece) & 0x3fffffff;

            $short_url = $host;
            #生成6位短连接 $hex 30位 每次右移5位,移动6次 5位11111=2^5-1=31
            for ($j = 0; $j < 6; $j++) {
                #将得到的值与0x0000003d,3d为61，即charset字符串的坐标最大值
                $short_url .= self::$charset[$hex & 0x0000003d];
                #循环完以后将hex右移5位
                $hex = $hex >> 5;
            }
            $short_url_list[] = $short_url;
        }
        return $short_url_list;
    }

    static function simple($input) {
        $base32 = array (
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
        'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
        'y', 'z', '0', '1', '2', '3', '4', '5'
        );

        //md5()生成32字符串 生成4组密码
        $hex = md5($input);
        $hexLen = strlen($hex);
        $subHexLen = $hexLen / 8;
        $output = array();

        for ($i = 0; $i < $subHexLen; $i++) {
            //把加密字符按照8位一组作为16进制字符串 转化为十进制 与0x3FFFFFFF(30位1)进行位与运算
            $subHexStr = substr ($hex, $i * 8, 8);
            $subHex = hexdec($subHexStr);
            $int = 0x3FFFFFFF & $subHex;
            $out = '';

            for ($j = 0; $j < 6; $j++) {
                //0x0000001F 是31 是$base32最大索引
                //把得到的值与0x0000001F进行位与运算，取得字符数组chars索引
                $index = 0x0000001F & $int;
                $out .= $base32[$index];
                $int = $int >> 5;
            }
            $output[] = $out;
        }

        return $output;
    }
}

$url = "http://www.cnblogs.com/zemliu/";
$short = Short_Url::short($url, 'http://t.cn/');
print_r($short);
$short = short_UrL::simple($url);
var_export($short);